#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

int g_mytest = 0;
int main(int argc, char const *argv[])
{
    pid_t pid;
    printf("Process running!\n");
    printf("Current user's MAX Process number is %ld\n", sysconf(_SC_CHILD_MAX));

    pid = fork();

    // 判定子进程是否创建成功
    if (pid < 0)
    {
        printf("Process forking FAILED!\n");
        exit(-1);
    }

    // 程序走到这里, 执行后续代码的可能是父进程, 也有可能是子进程, 这里可以通过fork函数返回的pid判定
    // 不好理解的是, 程序走到这里, fork函数返回了两次(父进程一次, 子进程一次), 而且fork在父进程中返回的值 和在子进程中fork返回的值是不同的
    // 通过判定他们的返回值, 从而运行程序不同的代码分支

    if (pid == 0) // 子进程的fork返回值是零, 子进程代码分支
    {
        while (1)
        {
            g_mytest++;
            sleep(1);
            printf("Child process running!, process id is %d, g_mytest is %d!\n", getpid(), g_mytest);
        }
    }

    else // 父进程fork返回值>0, 父进程代码分支
    {
        while (1)
        {
            g_mytest++;
            sleep(3);
            printf("Parent process running!, process id is %d, g_mytest is %d!\n", getpid(), g_mytest);
        }
    }
    return 0;
}

// 可以看到每一个程序中的g_mytest变量的值都是独立的,这两个进程都有写的动作, 内核会给不同的进程分配一块内存供其单独使用, 所以每一个进程的值互不干扰